# 进制转换       前缀：0b表示二进制，0o表示八进制，0x表示十六进制，默认是十进制
n = 85
result = bin(n)        # 将变量数值转换成二进制，无论参数是几进制
print(result)

result = oct(n)        # 将变量数值转换成八进制
print(result)

result = hex(n)        # 将变量数值转换成十六进制
print(result)

# 将十六进制转换成十进制输出？
n = 0x586
result = int(n)          # int函数默认将数据转换成十进制
print(result)

# 已知二进制转成十六进制，将二进制从右侧开始四位一组，最后一组不足四位补零
# 已知二进制转成八进制，将八进制从右侧开始三位一组，最后一组不足三位补零

# 位运算：针对二进制进行的运算（0为假，1为真）
n1 = 0b0110
n2 = 0b1000
# &是按位与运算符，类似and，从左往右，0-1-->0,1-0-->0…………,则n1&n2=0b0000,转成十进制为0
print(n1 & n2)
# |是按位或运算符，类似or,从左往右，0-1-->1,1-0-->1…………,则n1|n2=0b1110,转成十进制为14
print(n1 | n2)
# ^是按位异或运算符，上下两个数位相同时为0，不同为1,则n1^n2=0b1110
print(n1 ^ n2)

# 二进制的负数表示：原码（如0110） 反码（原码的对立数，1001） 补码（反码加一，1010，逢二进一）
'''
明确：
1.已知十进制负数，求二进制负数：
    1.正数的原码 2.原码取反 3.加一  ---> 得到的二进制就是负数的二进制
    例：-7的进制：
      步骤：
      1.先求+7的二进制：0000 0111（原码）
      2.反码：1111 1000
      3.补码：1111 1001
      则-7的二进制是：1111 1001
2.已知二进制的负数，求对应的十进制
（判断是否为负的二进制的依据，看二进制的最高位：1111 1010，最高位是1则为负数，0则为正数）
    1.二进制（负的） 2.二进制减一  3.取反  4.原码(将原码转成十进制，在十进制的前面添加负号)
    已知：二进制：1111 1010，十进制的表示？
    1111 1010   补码
    -       1
    ----------
    1111 1001    ----> 反码：0000 0110
    原码：0000 0110   --->  6
    则结果为-6.0
'''
# ~是按位取反运算符,将二进制原码进行逐位取反操作
print(~5)    # 就是将5的二进制进行逐位取反，再转成十进制输出

n = -9
result = bin(n)
print(result)      # 这个结果是简单的在9的二进制原码上加上了一个负号，并不是补码形式

# 如果需要得到负数的补码形式，可以使用函数to_twos_complement来计算，这是它的完整的示例：
def to_twos_complement(n, bits=8):
    if n >= 0:
        return bin(n)[2:].zfill(bits)
    else:
        # 计算绝对值的二进制表示
        binary = bin(abs(n))[2:].zfill(bits)
        # 取反
        inverted = ''.join('1' if bit == '0' else '0' for bit in binary)
        # 加1
        result = bin(int(inverted, 2) + 1)[2:].zfill(bits)
        return result
n = -9
print(f"{n}的二进制结果是: {bin(n)}")     # 输出-0b1001
print(f"{n}的补码形式是: {to_twos_complement(n)}")    # 输出11111001

# <<是左移动运算符,运算数的各二进位全部左移若干位，由<<右边的数字指定了移动的位数，高位丢弃，低位补零
n = 12  # 00001100
print(n << 1)    # 24=12*2
print(n << 2)    # 48=12*2*2
print(n << 3)    # 96=12*2*2*2

n = 26
print(n << 4)    # 26*16,也就是26乘以2的4次方

# >>是右移动运算符，规则与左移动运算符相反
n = 12
print(n >> 1)   # 6==12//2
print(n >> 2)   # 3==12//2//2
print(n >> 3)   # 1~=12//2//2//2(结果需要取整)